﻿// Inner Fire 游戏引擎库
// GameManager - 游戏主控类
//
// Copyright (c) 2025 by 尔西大帝. All rights reserved.
//
// 所属层级：框架层(5)
// 用于游戏的主控制
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2025-01-13

#pragma once

#include <dx/graphics/dx_graphics.h>
#include <game/input/game_input.h>
#include <game/lua/lua_manager.h>
#include <game/manager/resource_manager.h>
#include <game/manager/scene.h>
#include <game/resource/assets.h>
#include <stop_watch.h>
#include <ui/manager/ui_manager.h>
#include <xml_reader.h>
#include <game/config/config_manager.h>


namespace ifire::game {

class GameManager {
public:
  GameManager(const std::string_view& filename);
  GameManager(const GameManager& lhs) = delete;
  GameManager& operator=(const GameManager& lhs) = delete;
  ~GameManager();

  Scene* FindScene(ikit::sstr name);

  // 游戏更新
  void FixedUpdate();

  // 打印信息
  void PrintDebug(int index, const char* format, size_t len);

  // 获得一个默认的UIElement
  ikit::SpriteElement* GetEmptyUIElement();

  //
  // 属性访问
  //
  Scene* CurrentScene() const { return current_scene_; }
  dx::DxGraphics* GetGraphics() const { return dx_; }
  void SetGraphics(dx::DxGraphics* dx);
  inline GameInput* GetInput() const { return input_.get(); }
  inline Assets* GetAssets() const { return assets_.get(); }
  inline ResourceManager* GetResources() const { return resources_.get(); }
  inline ui::UIManager* GetUIManager() const { return uimanager_.get(); }
  inline LuaManager* GetLua() const { return lua_manager_.get(); }
  inline ConfigManager* GetConfig() const { return config_.get(); }
  XMFLOAT3 GetSkyBoxScale();
  Stopwatch& LoaderTimer() { return loader_timer_; }
  const XmlReader& Info() { return info_; }
   

private:
  // 载入Scene（这以后会并入ConfigInfo，将Scene和SceneInfo拆分开来）
  
  // 处理方向类的输入，包括鼠标
  void OnAxisInput();
  // 处理Gamepad的按钮
  void OnGamepadButtonInput();
  // 检查一个Node下面的项目，如果项目是文件，则操作文件，如果是目录，则操作下面的所有文件
  void LoadPathList(const ikit::XmlNode& path_list_node,
      const std::function<void(const char*)>& callback);

private:
  dx::DxGraphics* dx_ = nullptr;
  std::unique_ptr<ui::UIManager> uimanager_;
  eastl::vector<ScenePtr> scenes_;
  Scene* current_scene_;
  std::unique_ptr<Assets> assets_;
  std::unique_ptr<ResourceManager> resources_;
  std::unique_ptr<LuaManager> lua_manager_;
  std::unique_ptr<GameInput> input_;
  std::unique_ptr<ConfigManager> config_;
  XmlReader info_;
  Stopwatch loader_timer_;
  // 用于指定一个UI的图片（通常是一张白色图片，做为没有项目时的项目）
  ikit::sstr empty_ui_element_;
};
} // namespace ifire::game